define(function(require, exports, module) {
  var $ = require("$");
  var Position = require("bunny/position/1.0.0/position");
  var isIE6 = (window.navigator.userAgent || "").toLowerCase().indexOf("msie 6") !== -1;
  // target 是需要添加垫片的目标元素，可以传 `DOM Element` 或 `Selector`
  function Shim(target) {
    // 如果选择器选了多个 DOM，则只取第一个
    this.target = $(target).eq(0);
  }
  // 根据目标元素计算 iframe 的显隐、宽高、定位
  Shim.prototype.sync = function() {
    var target = this.target;
    var iframe = this.iframe;
    // 如果未传 target 则不处理
    if (!target.length) return this;
    var height = target.outerHeight();
    var width = target.outerWidth();
    // 如果目标元素隐藏，则 iframe 也隐藏
    // jquery 判断宽高同时为 0 才算隐藏，这里判断宽高其中一个为 0 就隐藏
    // http://api.jquery.com/hidden-selector/
    if (!height || !width || target.is(":hidden")) {
      iframe && iframe.hide();
    } else {
      // 第一次显示时才创建：as lazy as possible
      iframe || (iframe = this.iframe = createIframe(target));
      iframe.css({
        height: height,
        width: width
      });
      Position.pin(iframe[0], target[0]);
      iframe.show();
    }
    return this;
  };
  // 销毁 iframe 等
  Shim.prototype.destroy = function() {
    if (this.iframe) {
      this.iframe.remove();
      delete this.iframe;
    }
    delete this.target;
  };
  if (isIE6) {
    module.exports = Shim;
  } else {
    // 除了 IE6 都返回空函数
    function Noop() {}
    Noop.prototype.sync = function() {
      return this;
    };
    Noop.prototype.destroy = Noop;
    module.exports = Noop;
  }
  // Helpers
  // 在 target 之前创建 iframe，这样就没有 z-index 问题
  // iframe 永远在 target 下方
  function createIframe(target) {
    var css = {
      display: "none",
      border: "none",
      opacity: 0,
      position: "absolute"
    };
    // 如果 target 存在 zIndex 则设置
    var zIndex = target.css("zIndex");
    if (zIndex && zIndex > 0) {
      css.zIndex = zIndex - 1;
    }
    return $("<iframe>", {
      src: "javascript:''",
      // 不加的话，https 下会弹警告
      frameborder: 0,
      css: css
    }).insertBefore(target);
  }
});
